package com.sky.controller.user;

import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.UserLoginDTO;
import com.sky.entity.User;
import com.sky.properties.JwtProperties;
import com.sky.result.Result;
import com.sky.service.UserService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import com.sky.vo.UserLoginVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RequestMapping("/user/user")
@RestController
@Slf4j
public class UserController {


    @Autowired
    private UserService userService; // 确保UserService有被@ComponentScan扫描到的实现类

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 13.用户（微信）登录接口
     * @param userLoginDTO
     * @return
     */
    @PostMapping("/login")
    public Result login(@RequestBody UserLoginDTO userLoginDTO){
        log.info("用户微信登录，{}",userLoginDTO.getCode());

        //调用service层进行登录，从微信服务器返回信息，封装到User对象中
        User user = userService.wxlogin(userLoginDTO);

        //为微信用户生成jwt令牌
        //*：登录成功后，生成jwt令牌(这个是特殊的，只有登录接口需要有这个，其它都没有)
        // 创建一个用于存储JWT声明（claims）的Map集合
        Map<String, Object> claims = new HashMap<>();
        // 向claims中添加员工ID信息，键为JwtClaimsConstant.EMP_ID，值为员工ID
        claims.put(JwtClaimsConstant.USER_ID, user.getId());
        // 使用JWT工具类生成token，传入密钥、过期时间和claims
        String token = JwtUtil.createJWT(
                jwtProperties.getUserSecretKey(),  // 获取用户密钥
                jwtProperties.getUserTtl(),        // 获取用户token过期时间
                claims);                           // 传入claims信息


        // 构建员工登录返回对象(VO)
        UserLoginVO userLoginVO = UserLoginVO.builder()
                .id(user.getId())             // 设置员工ID
                .openid(user.getOpenid())  // 设置用户名
                .token(token)                      // 设置生成的token
                .build();                          // 构建对象

        return Result.success(userLoginVO);
    }
}
